home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / civ-0.000 / civ-0 / civ-0.3 / src / display.cc.orig < prev    next >
Text File  |  1995-02-16  |  6KB  |  236 lines

  1. #include <stdarg.h>
  2. #include <stdio.h>
  3. #include "defs.h"
  4. #include "display.h"
  5. #include "world.h"
  6. #include "city.h"
  7. #include "trans.h"
  8. #include "units.h"
  9. #include "player.h"
  10.  
  11. // -1 if no cursor, 0 if cursor state is inverted
  12. // 1 is cursor state is piece shown
  13. static int cursorOn = -1;
  14. int WDisplay::white;
  15.  
  16. WDisplay::WDisplay(World *world)
  17. {
  18.   maxX = world->MaxX();
  19.   maxY = world->MaxY();
  20.   left = top = 0;
  21.   where = SHOWING_MAP;
  22. }
  23.  
  24. void WDisplay::AllocColors()
  25. {
  26.   white = screen->AllocColor("#ffffffffffff");
  27. }
  28.  
  29. WDisplay::~WDisplay()
  30. {
  31.   DisableCursor();
  32. }
  33.  
  34. void WDisplay::Message(int color, char *format, ...)
  35. {
  36.   char str[256];
  37.   va_list ap;
  38.   va_start(ap, format);
  39.   vsprintf(str, format, ap);
  40.   va_end(ap);
  41.   screen->DisplayMessage(str, color);
  42. }
  43.  
  44. void WDisplay::ShowPlayerInfo()
  45. {
  46.   if (where != SHOWING_MAP) return;
  47.   int y = 64+VertSpace+2;
  48.   Player *p = players[playerId];
  49.   screen->FillRect(0, y, HorizSpace-1, 30, City::black);
  50.   screen->DrawPixmap(0, y+1, City::hMoney);
  51.   screen->WriteInt(8, y, p->money, 5, City::white);
  52.   if (p->researching != NULL)
  53.     screen->WriteStr(0, y+10, p->researching, City::white);
  54.   screen->WriteInt(0, y+20, p->tax/10, 2, City::white);
  55.   screen->DrawPixmap(22, y+21, City::hBulb);
  56.   int per = (p->scienceAcc*100)/p->needScience;
  57.   screen->WriteInt(30, y+20, per > 100 ? 100 : per, 3,
  58.            City::white);
  59.   screen->WriteStr(54, y+20, "%", City::white);
  60. }
  61.  
  62. void WDisplay::ShowMap()
  63. {
  64.   if (where != SHOWING_MAP) {
  65.     screen->Clear();
  66.     where = SHOWING_MAP;
  67.     Update();
  68.   }
  69. }
  70.  
  71. void WDisplay::ShowCityInfo(class City *ptr)
  72. {
  73.   if (where != SHOWING_CITY || city != ptr) {
  74.     where = SHOWING_CITY;
  75.     city = ptr;
  76.     Update();
  77.   }
  78. }
  79.  
  80. void WDisplay::Update()
  81. {
  82.   if (where == SHOWING_MAP) {
  83.     ShowPlayerInfo();
  84.     world->Draw(left, top);
  85.     world->DrawMainMap();
  86.   }
  87.   else
  88.     city->InfoScreen();
  89. }
  90.  
  91. void WDisplay::Center(int wx, int wy)
  92. {
  93.   left = (wx-SquaresWide/2+maxX) % maxX;
  94.   top = (wy-SquaresHigh/2+maxY) % maxY;
  95.   Update();
  96. }
  97.  
  98. void WDisplay::ShowPiece(int worldx, int worldy, ulong id)
  99. {
  100.   ShowMap();
  101.   if (Visible(worldx, worldy)) {
  102.     int sx, sy;
  103.     TranslateScreen(worldx, worldy, sx, sy);
  104.     if (sx >= 1 && sx < SquaresWide-1 && sy >= 1 && sy < SquaresHigh-1)
  105.       return;
  106.   }
  107.  
  108.   left = (worldx-SquaresWide/2+maxX) % maxX;
  109.   top = (worldy-SquaresHigh/2+maxY) % maxY;
  110.  
  111.   Update();
  112. }
  113.  
  114. void WDisplay::ShowCity(int worldx, int worldy, ulong id)
  115. {
  116.   ShowMap();
  117.   if (Visible(worldx, worldy)) {
  118.     int sx, sy;
  119.     TranslateScreen(worldx, worldy, sx, sy);
  120.     if (sx >= 1 && sx < SquaresWide-1 && sy >= 1 && sy < SquaresHigh-1)
  121.       return;
  122.   }
  123.  
  124.   // center the city on the screen
  125.   left = (worldx-SquaresWide/2+maxX) % maxX;
  126.   top = (worldy-SquaresHigh/2+maxY) % maxY;
  127.  
  128.   Update();
  129. }
  130.  
  131. void WDisplay::BlitMap(int x1, int y1, int w, int h, int x2, int y2)
  132. {
  133.   screen->BitBlt(x1*SquareWidth+HorizSpace, y1*SquareHeight+VertSpace,
  134.          w*SquareWidth, h*SquareHeight,
  135.          x2*SquareWidth+HorizSpace, y2*SquareHeight+VertSpace);
  136. }
  137.  
  138. void WDisplay::ScrollUp()
  139. {
  140.   top = (top+maxY-1) % maxY;
  141.   BlitMap(0, 0, SquaresWide, SquaresHigh-1, 0, 1);
  142.   world->Draw(left, top, SquaresWide, 1, 0, 0);
  143. }
  144.  
  145. void WDisplay::ScrollDown()
  146. {
  147.   BlitMap(0, 1, SquaresWide, SquaresHigh-1, 0, 0);
  148.   world->Draw(left, top + SquaresHigh, SquaresWide, 1, 0, SquaresHigh-1);
  149.   top = (top+1) % maxY;
  150. }
  151.  
  152. void WDisplay::ScrollLeft()
  153. {
  154.   left = (left+maxX-1) % maxX;
  155.   BlitMap(0, 0, SquaresWide-1, SquaresHigh, 1, 0);
  156.   world->Draw(left, top, 1, SquaresHigh, 0, 0);
  157. }
  158.  
  159. void WDisplay::ScrollRight()
  160. {
  161.   BlitMap(1, 0, SquaresWide-1, SquaresHigh, 0, 0);
  162.   world->Draw(left + SquaresWide, top, 1, SquaresHigh, SquaresWide-1, 0);
  163.   left = (left+1) % maxX;
  164. }
  165.  
  166. void WDisplay::TranslateScreen(int worldx, int worldy,
  167.                   int &screenx, int &screeny)
  168. {
  169.   screenx = (worldx - left + world->MaxX()) % world->MaxX();
  170.   screeny = (worldy - top + world->MaxY()) % world->MaxY();
  171. }
  172.  
  173. void WDisplay::TranslateWorld(int screenx, int screeny,
  174.                  int &worldx, int &worldy)
  175. {
  176.   worldx = (left + screenx) % world->MaxX();
  177.   worldy = (top + screeny) % world->MaxY();
  178. }
  179.  
  180. void WDisplay::EnableCursor(int worldx, int worldy, ulong id)
  181. {
  182.   ShowPiece(worldx, worldy, id);
  183.   if (cursorOn != -1) DisableCursor();
  184.   cursorx = worldx;
  185.   cursory = worldy;
  186.   cursorUnit = trans->TransUnit(id);
  187.   TranslateScreen(cursorx, cursory, cursorsx, cursorsy);
  188.   world->DrawBase(cursorx, cursory, cursorsx, cursorsy);
  189.   cursorOn = 0;
  190.   screen->StartTimer(CURSOR_TIMER, 500, DisplayCursor);
  191. }
  192.  
  193. void WDisplay::DisableCursor()
  194. {
  195.   if (cursorOn == -1) return;
  196.   screen->StopTimer(CURSOR_TIMER);
  197.   if (cursorOn == 0)
  198.     world->Draw(cursorx, cursory, 1, 1, cursorsx, cursorsy);
  199.   else
  200.     world->MarkSquare(cursorx, cursory, -1);
  201.   cursorOn = -1;
  202. }
  203.  
  204. // true if position is on the screen
  205. int WDisplay::Visible(int worldx, int worldy)
  206. {
  207.   if (where != SHOWING_MAP) return 0;
  208.   int right = (left+SquaresWide-1) % world->MaxX();
  209.   if ((right > left && (worldx < left || worldx > right)) ||
  210.       (right < left && (worldx > right && worldx < left)))
  211.     return 0;
  212.   int bot = (top+SquaresHigh-1) % world->MaxY();
  213.   if (((bot > top) && (worldy < top || worldy > bot)) ||
  214.       (bot < top) && (worldy > bot && worldy < top))
  215.     return 0;
  216.   return 1;
  217. }
  218.  
  219. void DisplayCursor(int timer)
  220. {
  221.   if (cursorOn == -1) return;
  222.   if (cursorOn == 0) {
  223.     world->DrawBase(display->cursorx, display->cursory,
  224.             display->cursorsx, display->cursorsy);
  225.     display->cursorUnit->Draw(display->cursorsx*SquareWidth+HorizSpace,
  226.                   display->cursorsy*SquareHeight+VertSpace);
  227.     world->MarkSquare(display->cursorx, display->cursory, display->white);
  228.   }
  229.   else {
  230.     world->DrawBase(display->cursorx, display->cursory,
  231.             display->cursorsx, display->cursorsy);
  232.     world->MarkSquare(display->cursorx, display->cursory, -1);
  233.   }
  234.   cursorOn ^= 1;
  235. }
  236.